package com.hyper_yang._01_jdbc.prob;

import org.junit.jupiter.api.Test;

import java.io.*;
import java.sql.*;

/*
 通过 jdbc上传头像图片到数据库
 */
public class ImageTest {

    @Test
    public void testWrite() throws ClassNotFoundException, SQLException, IOException {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1", "root", "abc123");
        String sql = "insert into t_img(id, name, avatar) value(?,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        // 为占位符赋值
        preparedStatement.setInt(1, 0);
        preparedStatement.setString(2, "第一次测试图🤮");
        // 创建字符输入流，读取本地资源图片
        FileInputStream fis = new FileInputStream("C:\\Users\\lenovo\\Desktop\\测试.png");
        preparedStatement.setBinaryStream(3, fis, fis.available()); // 传入流 自动 read
        int i = preparedStatement.executeUpdate();
        System.out.println(i > 0 ? "成功" : "失败");
        fis.close();
        preparedStatement.close();
        connection.close();
    }

    @Test
    public void testRead() throws ClassNotFoundException, SQLException, IOException {
        // 加载 JDBC 驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        // 建立数据库连接
        Connection connection = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai",
                "root",
                "abc123"
        );

        // SQL 查询语句：根据 ID 查询图片数据
        String sql = "SELECT avatar FROM t_img WHERE id = ?";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, 1); // 查询 ID 为 0 的图片，请确保数据库中有此 ID 的图片

        ResultSet resultSet = preparedStatement.executeQuery();

        if (resultSet.next()) { // 如果找到了对应的记录
            // 获取 BLOB 字段的二进制流
            InputStream inputStream = resultSet.getBinaryStream("avatar");

            if (inputStream != null) {
                // 指定保存图片的新路径和文件名
                // 请确保此路径存在且你的程序有写入权限
                String outputPath = "C:\\Users\\lenovo\\Desktop\\read_res.png";

                // 创建文件输出流，将读取到的数据写入文件
                FileOutputStream fileOutputStream = new FileOutputStream(outputPath);

                byte[] buffer = new byte[4096]; // 缓冲区大小，可以根据需要调整
                int len;

                // 循环读取输入流并写入输出流
                while ((len = inputStream.read(buffer)) != -1) {
                    fileOutputStream.write(buffer, 0, len);
                }

                // 关闭文件输出流
                fileOutputStream.close();
                System.out.println("图片已成功读取并保存到：" + outputPath);
            } else {
                System.out.println("ID 为 0 的记录中没有图片数据。");
            }
        } else {
            System.out.println("未找到 ID 为 0 的图片记录。");
        }

        // 关闭所有 JDBC 资源和流
        // 在测试中，即使没有 try-finally，JUnit 通常也会处理，但习惯上仍然建议显式关闭。
        // 在生产代码中，务必使用 try-with-resources 或 finally 块确保资源关闭。
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}
